/*
 * Copyright 2010 Nicholas Alexander Cross
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 	http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.intellij.lang.plist.parser;

import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import org.intellij.lang.plist.parser.PListElementTypes;

%%

%class _PListLexer
%implements FlexLexer
%final
%unicode
%function advance
%type IElementType

%{

%}

LineTerminator = \r|\n|\r\n

WhiteSpace = [ \t]
AnySpace = {LineTerminator} | {WhiteSpace} | [\f]

Comment = {TraditionalComment} | {DocumentationComment} | {LineComment}

TraditionalComment   = "/*" [^*] ~"*/" | "/*" "*"+ "/"
DocumentationComment = "/**" {CommentContent} "*"+ "/"
CommentContent = ( [^*] | \*+ [^/*] )*
LineComment = {WhiteSpace}* "//" .*

DictionaryOpen = \{
DictionaryClose = \}
DictionaryKey = [:jletter:] (\. ([:jletter:]|[:jletterdigit:]) | [:jletter:] | [:jletterdigit:])* 


KeyValueAssignment = =
KeyValueClose = ;

ArrayOpen = \(
ArrayClose = \)

ItemSeperator = ,

StringLiteral = \" ( \\\" | [^\"\n\r] )* \"
Number = [:digit:]*(\.[:digit:]+)?

//%state DICTIONARY, ARRAY, KEY_VALUE, VALUE

%%

<YYINITIAL> {
    {WhiteSpace}+           { return PListElementTypes.WHITE_SPACE;}
    {DictionaryOpen}        { return PListElementTypes.LEFT_BRACE; }
    {ArrayOpen}             { return PListElementTypes.LEFT_PARENTHESES; }
    {DictionaryClose}       { return PListElementTypes.RIGHT_BRACE;    }
    {ArrayClose}            { return PListElementTypes.RIGHT_PARENTHESES;    }
    {ItemSeperator}         { return PListElementTypes.COMMA;}
    {KeyValueAssignment}    { return PListElementTypes.EQUALS;}
    {StringLiteral}         { return PListElementTypes.STRING;}
    {DictionaryKey}         { return PListElementTypes.DICTIONARY_KEY;}
    {Number}                { return PListElementTypes.NUMBER;}
    {KeyValueClose}         { return PListElementTypes.SEMI_COLON;}
    {Comment}               { return PListElementTypes.COMMENT;}
    {AnySpace}+             { return PListElementTypes.WHITE_SPACE;}
    .                       { return PListElementTypes.BAD_CHARACTER;}
}
